package com.noble.library.utils;

import android.app.Activity;
import android.content.Context;
import android.graphics.Bitmap;
import android.graphics.drawable.Drawable;
import android.os.Build;
import android.os.Looper;
import android.text.Editable;
import android.text.Selection;
import android.view.View;
import android.view.ViewGroup;
import android.view.ViewManager;
import android.widget.EditText;
import android.widget.ImageView;

import com.noble.library.log.PLogger;
import com.noble.library.observe.MsgMgr;

/**
 * 封装一些UI的功能，比如需要在主线程中执行的操作。<br>
 * 各种UI的一些操作。
 */
public class UIUtil {

    /**
     * 保证在UI Thread中执行。
     */
    public static void addView(final ViewManager viewManager, final View view, final ViewGroup.LayoutParams params) {
        MsgMgr.getInstance().runOnUiThread(new Runnable() {
            @Override
            public void run() {
                try {// 对activity并未开始创建时的添加行为进行错误拦截
                    viewManager.addView(view, params);
                } catch (Exception e) {
                    e.printStackTrace();
                }
            }
        });
    }

    /**
     * 保证在UI Thread中执行。
     */
    public static void removeView(final ViewManager viewManager, final View view) {
        MsgMgr.getInstance().runOnUiThread(new Runnable() {
            @Override
            public void run() {
                viewManager.removeView(view);
            }
        });
    }

    /**
     * 在Main UIThread中设置ImageView的src。
     *
     * @param imageView ImageView实例。
     * @param resId     资源Id。
     */
    public static void setImageResource(final ImageView imageView, final int resId) {
        if (imageView == null) {
            return;
        }

        if (Looper.myLooper() == Looper.getMainLooper()) {
            imageView.setImageResource(resId);
            return;
        }

        MsgMgr.getInstance().runOnUiThread(new Runnable() {
            @Override
            public void run() {
                imageView.setImageResource(resId);
            }
        });
    }

    /**
     * 在Main UIThread中设置ImageView的src。
     *
     * @param imageView ImageView实例。
     * @param bm        图片资源。
     */
    public static void setImageBitmap(final ImageView imageView, final Bitmap bm) {
        if (imageView == null) {
            return;
        }

        if (Looper.myLooper() == Looper.getMainLooper()) {
            imageView.setImageBitmap(bm);
            return;
        }

        MsgMgr.getInstance().runOnUiThread(new Runnable() {
            @Override
            public void run() {
                imageView.setImageBitmap(bm);
            }
        });
    }

    /**
     * 通过文件名获取资源Id。
     *
     * @param fileName 资源文件名。
     * @return 资源的Id。
     */
    public static int getResIdFromDrawable(Context context, String fileName) {
        try {
            return context.getResources().getIdentifier(fileName, "drawable", context.getPackageName());
        } catch (Exception e) {
            PLogger.printThrowable(e);
        }

        return 0;
    }

    /**
     * 获取控件的高度
     *
     * @param view 控件
     * @return 控件高度
     */
    public static int getViewHeight(View view) {
        if (null == view) return 0;
        view.measure(View.MeasureSpec.UNSPECIFIED, View.MeasureSpec.UNSPECIFIED);
        return view.getMeasuredHeight();
    }

    /**
     * 设置背景bitmap： 兼容低版本
     */
    public static void setBackground(View v, Drawable background) {
        if (v == null) return;

        if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.JELLY_BEAN) {
            v.setBackground(background);
        } else {
            v.setBackgroundDrawable(background);
        }
    }

    /**
     * edittext光标定位到文字后
     */
    public static void endCursor(EditText editText) {
        editText.requestFocus();
        Editable etext = editText.getText();
        Selection.setSelection(etext, etext.length());
    }

    /**
     * Activity是否正在释放
     *
     * @param context
     * @return
     */
    public static boolean isActDestroyed(Context context) {
        return Build.VERSION.SDK_INT >= Build.VERSION_CODES.JELLY_BEAN_MR1 &&
                context instanceof Activity && ((Activity) context).isDestroyed();
    }

    /**
     * 获取setContentView设置的View
     *
     * @param context
     * @return
     */
    public static View getContentView(Activity context) {
        return ((ViewGroup) context.findViewById(android.R.id.content)).getChildAt(0);
    }
}
